package ar.edu.utn.frsf.tpae.a2014.g03.persistence.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.annotations.OrderBy;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import ar.edu.utn.frsf.tpae.a2014.g03.enums.EstadoPedidoEnum;
import ar.edu.utn.frsf.tpae.a2014.g03.persistence.dao.HistorialPedidoDAO;
import ar.edu.utn.frsf.tpae.a2014.g03.persistence.model.HistorialPedido;
import ar.edu.utn.frsf.tpae.a2014.g03.persistence.model.Pedido;

@Repository
public class HistorialPedidoHibernateDao implements HistorialPedidoDAO {

	private SessionFactory sessionFactory;

	// Setter utilizado por Spring.
	@Autowired
	public void setSessionFactory(SessionFactory factory) {
		this.sessionFactory = factory;
	}

	private Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

	@Override
	public HistorialPedido persistir(HistorialPedido historialPedido) {
		HistorialPedido entity = historialPedido;
		if (entity != null) {
			getCurrentSession().saveOrUpdate(entity);
		}
		return entity;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosEnCurso(Integer idCliente) {

		List<Pedido> listaPedidos = new ArrayList<Pedido>();
		if (idCliente != null) {

			Session session = sessionFactory.getCurrentSession();
			Query query = session
					.createQuery("select hp.pedido from HistorialPedido hp where (hp.estado = 'ACEPTADO' OR hp.estado='A_RETIRAR' OR hp.estado='EN_TRANSPORTE') AND   hp.estado <> 'entregado' and hp.pedido.cliente.id = :id and  hp.fechaCambio in (select max(hpi.fechaCambio) from HistorialPedido hpi where hpi.pedido.id=hp.pedido.id ) Order by hp.fechaCambio");
			query.setParameter("id", idCliente);
			listaPedidos=query.list();
		}
		return (listaPedidos);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosFinalizados(Integer idCliente) {
		List<Pedido> listaPedidos = new ArrayList<Pedido>();
		if (idCliente == null) {
			return listaPedidos;
		}

		listaPedidos = getCurrentSession()
				.createQuery(
						"select hp.pedido from HistorialPedido hp where hp.estado = 'ENTREGADO' and hp.pedido.cliente.id = '"
								+ idCliente + "' Order by hp.fechaCambio").list();

		return listaPedidos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosByEstado(EstadoPedidoEnum estado) {
		List<Pedido> listaPedidos = new ArrayList<Pedido>();

		listaPedidos = getCurrentSession().createQuery(
				"select hp.pedido from HistorialPedido hp where hp.estado='"
						+ estado.name() + "'").list();

		return listaPedidos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<HistorialPedido> findHistorialByPedido(Integer idPedido) {
		List<HistorialPedido> listaPedidos = new ArrayList<HistorialPedido>();
		if (idPedido == null) {
			return listaPedidos;
		}

		listaPedidos = getCurrentSession().createQuery(
				"from HistorialPedido hp where hp.pedido.id = '" + idPedido
						+ "'").list();

		return listaPedidos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosAsignados(Integer idTransportista) {
		List<Pedido> listaPedidos = new ArrayList<Pedido>();
		try {

			if (idTransportista != null) {

				listaPedidos = getCurrentSession()
						.createQuery(
								"select hp.pedido from HistorialPedido hp where hp.estado!='"
										+ EstadoPedidoEnum.ENTREGADO.toString()+"' "
										+"and (hp.estado='"+ EstadoPedidoEnum.A_RETIRAR.toString()+"' or "
												+ "hp.estado='"+ EstadoPedidoEnum.EN_TRANSPORTE.toString()+"')"
										+ " and hp.pedido.transportista.id = '"
										+ idTransportista
										+ "'and hp.fechaCambio in (select max(hpi.fechaCambio) from HistorialPedido hpi where hpi.pedido.id=hp.pedido.id ) Order by hp.fechaCambio")
						.list();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaPedidos;
	}

	@Override
	public void deleteAll() {
		getCurrentSession().createQuery("delete from HistorialPedido")
				.executeUpdate();
	}

}
